package com.ruoyi.system.bean;

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Optional;

@Data
public class ResultDTO<T> implements Serializable {


    @JsonIgnore
    private HashMap<String, Object> map;

    /**
     * 状态码
     */
    public static final String CODE_TAG = "code";

    private int code;

    /**
     * 返回内容
     */
    public static final String MSG_TAG = "msg";

    private String msg;

    /**
     * 数据对象
     */
    public static final String DATA_TAG = "data";

    private T data;

    /**
     * 初始化一个新创建的 ResultDTO 对象，使其表示一个空消息。
     */
    public ResultDTO() {
        this.map = new HashMap<>();
    }

    /**
     * 初始化一个新创建的 ResultDTO 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     */
    public ResultDTO(int code, String msg) {
        this();
        this.code = code;
        this.msg = msg;
    }

    /**
     * 初始化一个新创建的 ResultDTO 对象
     *
     * @param code 状态码
     * @param msg  返回内容
     * @param data 数据对象
     */
    public ResultDTO(int code, String msg, T data) {
        this();
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public ResultDTO(HttpStatus code, String msg, T data) {
        this();
        this.code = code.code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 返回成功消息
     *
     * @return 成功消息
     */
    public static ResultDTO success() {
        return ResultDTO.success("操作成功");
    }

    /**
     * 返回成功数据
     *
     * @return 成功消息
     */
    public static <T> ResultDTO success(T data) {
        return ResultDTO.success("操作成功", data);
    }

    //    /**
    //     * 返回成功消息
    //     *
    //     * @param msg 返回内容
    //     * @return 成功消息
    //     */
    //    public static ResultDTO success(String msg) {
    //        return ResultDTO.success(msg, null);
    //    }
    //

    /**
     * 返回成功消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 成功消息
     */
    public static <T> ResultDTO<T> success(String msg, T data) {
        return (ResultDTO<T>) new ResultDTO(200, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @return
     */
    public static ResultDTO error() {
        return ResultDTO.error("操作失败");
    }

    /**
     * 返回错误消息
     *
     * @param msg 返回内容
     * @return 警告消息
     */
    public static ResultDTO error(String msg) {
        return ResultDTO.error(msg, null);
    }

    /**
     * 返回错误消息
     *
     * @param msg  返回内容
     * @param data 数据对象
     * @return 警告消息
     */
    public static ResultDTO error(String msg, Object data) {
        return new ResultDTO(HttpStatus.ERROR, msg, data);
    }

    /**
     * 返回错误消息
     *
     * @param code 状态码
     * @param msg  返回内容
     * @return 警告消息
     */
    public static ResultDTO error(int code, String msg) {
        return new ResultDTO(code, msg, null);
    }

    public void put(String key, Object value) {
        this.map.put(key, value);
    }

    public JSONObject build() {
        JSONObject json = new JSONObject();
        json.put("code", this.getCode());
        json.put("msg", this.getMsg());
        json.put("data", this.getData());
        Optional.ofNullable(this.getMap()).ifPresent(m -> m.forEach(json::put));
        return json;
    }
}
